# coding: utf-8defMergeSort(nums):iflen(nums)<=1:return nums
num =int(len(nums)/2)# 从中间,进行数据的拆分, 递归的返回数据进行迭代排序
left = MergeSort(nums[:num])
right = MergeSort(nums[num:])print("left: ", left)print("right: ", right)print("-"*20)return Merge(left, right)defMerge(left, right):
l, r =0,0
result =[]while l <len(left)and r <len(right):if left[l]< right[r]:
result.append(left[l])
l +=1else:
result.append(right[r])
r +=1
result += left[l:]
result += right[r:]return result
if __name__ =="__main__":
nums =[2,6,8,5,1,4,9,3,7]
nums = MergeSort(nums)print('result:', nums)
4、快速排序
#!/usr/bin/python# coding:utf8defquick_sort(nums, start, end):
i = start
j = end
# 结束排序if i >= j:return# 保存首个数值
key = nums[i]# 一次排序,i和j的值不断的靠拢,然后最终停止,结束一次排序while i < j:# 和最右边的比较,如果>=key,然后j-1,慢慢的和前一个值比较;如果值<key,那么就交换位置while i < j and key <= nums[j]:print(key, nums[j],'*'*30)
j -=1
nums[i]= nums[j]# 交换位置后,然后在和最左边的值开始比较,如果<=key,然后i+1,慢慢的和后一个值比较;如果值>key,那么就交换位置while i < j and key >= nums[i]:print(key, nums[i],'*'*30)
i +=1
nums[j]= nums[i]
nums[i]= key
# 左边排序
quick_sort(nums, start, i-1)# 右边排序
quick_sort(nums, i+1, end)if __name__ =="__main__":
nums =[2,6,8,5,1,4,9,3,7]
quick_sort(nums,0,len(nums)-1)print('result:', nums)
5、基数排序
#************************基数排序****************************#确定排序的次数#排序的顺序跟序列中最大数的位数相关defradix_sort_nums(L):
maxNum = L[0]#寻找序列中的最大数for x in L:if maxNum < x:
maxNum = x
#确定序列中的最大元素的位数
times =0while(maxNum >0):
maxNum =int((maxNum/10))
times +=1return times
#找到num从低到高第pos位的数据defget_num_pos(num, pos):return(int((num/(10**(pos-1)))))%10#基数排序defradix_sort(L):
count =10*[None]#存放各个桶的数据统计个数
bucket =len(L)*[None]#暂时存放排序结果#从低位到高位依次执行循环for pos inrange(1, radix_sort_nums(L)+1):#置空各个桶的数据统计for x inrange(0,10):
count[x]=0#统计当前该位(个位,十位,百位....)的元素数目for x inrange(0,len(L)):#统计各个桶将要装进去的元素个数
j = get_num_pos(int(L[x]), pos)
count[j]+=1#count[i]表示第i个桶的右边界索引for x inrange(1,10):
count[x]+= count[x-1]#将数据依次装入桶中for x inrange(len(L)-1,-1,-1):#求出元素第K位的数字
j = get_num_pos(L[x], pos)#放入对应的桶中,count[j]-1是第j个桶的右边界索引
bucket[count[j]-1]= L[x]#对应桶的装入数据索引-1
count[j]-=1# 将已分配好的桶中数据再倒出来,此时已是对应当前位数有序的表for x inrange(0,len(L)):
L[x]= bucket[x]